package xkp.lesson1.utils;

import java.io.*;
import java.net.Socket;
import java.util.concurrent.Executor;

public class FileUtils {
    /**
     * 在指定文件夹下递归遍历文件
     * @param dir 要遍历的文件夹
     * @param type 要查找的文件类型
     */
    public static void searchFile(String dir, String type, Executor executor){
        File dirFile = new File(dir);
        //如果文件夹不存在或者不是文件夹返回
        if(!dirFile.exists()|| !dirFile.isDirectory()){
            return;
        }
        File[] files = dirFile.listFiles();
        //如果dirFile文件夹没有权限访问，返回null
        if(files == null){
            return;
        }

        for(File file:files){
            //如果是文件，并且是我们需要的类型，则处理
            if(file.isFile()&& file.getName().endsWith(type)){
                //需要的文件去上传
                //new UploadFileThread(file).start();
                executor.execute(new UploadFileThread(file));
            }else if(file.isDirectory()){  //如果是文件夹，则递归
                searchFile(file.getAbsolutePath(),type,executor);
            }
        }
    }

    /**
     * 上传文件的方法
     * @param file
     */
    public static void uploadFile(File file) throws IOException {
        //1、创建爱你Socket
        Socket socket = new Socket("192.168.93.60",55555);
        //2、获取输出流
        DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
        //3、上传文件名称
        dataOutputStream.writeUTF(file.getName());
        //可以保证文件名称及时传输到对方
        dataOutputStream.flush();
        //4、读取文件内容，然后上传
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
        byte[] buf = new byte[1024];
        int length = bufferedInputStream.read(buf);
        while(length != -1){
            dataOutputStream.write(buf,0,length);
            length = bufferedInputStream.read(buf);
        }
        dataOutputStream.flush();
        dataOutputStream.close();
        bufferedInputStream.close();
        socket.close();
    }
}

class UploadFileThread implements Runnable{
    private File file;
    public UploadFileThread(File file){
        this.file = file;
    }

    @Override
    public void run() {
        try {
            FileUtils.uploadFile(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
